package main

/**
管道的注意事项
1、声明之后需要make开辟内存才可以使用
2、如果写满了 继续写会报错	// fatal error: all goroutines are asleep - deadlock!
3、声明chan只读或者只写
	只读	var intChan	<- chan int
	只写	var intCHan chan <-	int

只读只写管道的意义：

    方法参数 控制 只读只写 房子误操作
    底层处理 效率也会更高
	close的继续写也会报错，但是可读。如果没有close去读取会死锁
	关键字 select	label for { select{case := chanName default return}}


	func isPrimeA(intChan int, primeChan chan int, exitChan chan boo){
		比如这个方法的 参数一 只读 参数二三 只写
	}

*/

import "fmt"

func main() {
	onlyIn()
	onlyOut()
	fmt.Println()
}

func onlyIn() {
	var chanIn chan<- int
	chanIn = make(chan int, 1)
	chanIn <- 1
	//chanIn <- 2	// fatal error: all goroutines are asleep - deadlock!
	//fmt.Println(<-chanIn) // 读取只写的通道 编译失败	invalid operation: cannot receive from send-only channel chanIn (variable of type chan<- int)
	fmt.Println(chanIn)
}

func onlyOut() {
	var chanOut <-chan int
	//chanOut <- 2 // 编译不通过	invalid operation: cannot receive from send-only channel chanIn (variable of type chan<- int)
	chanOut = make(chan int, 2)
	fmt.Println(chanOut)

}
